
const express = require("express");
const morgan = require("morgan");
const fsr = require("file-stream-rotator");
const http = require("http");
const path = require("path");
const fs = require("fs");

const app = express();
const PORT = 9588;

// 创建 HTTP 服务器
const server = http.createServer(app);

// 创建请求日志文件轮转流
const logStream = fsr.getStream({
  date_format: "YYYY-MM-DD",
  filename: "log/access-%DATE%.log",
  frequency: "custom",
  verbose: true,
  custom_rotation_size: "1M", // 每1MB滚动一次
});
// 使用morgan中间件记录请求到日志文件
app.use(morgan('combined', { stream: logStream }));
// 使用中间件
app.use(express.json()); // 用于解析JSON的中间件

// 自动导入和使用路由

// 读取routes目录
const routesDir = path.join(__dirname, 'routes');
fs.readdirSync(routesDir).forEach(file => {
  const filePath = path.join(routesDir, file);
  const stats = fs.statSync(filePath);
  let routeName, router;
  if (stats.isDirectory()) {
    // 如果是目录，尝试导入index.js
    const indexPath = path.join(filePath, 'index.js');
    if (fs.existsSync(indexPath)) {
      routeName = file;
      router = require(indexPath);
    }
  } else if (file.endsWith('.js')) {
    // 如果是JS文件，直接导入
    routeName = file.replace('.js', '');
    router = require(filePath);
  }
  // 注册路由
  if (router && typeof router.use === 'function') {
    console.log(`自动注册路由: /${routeName}`);
    app.use(`/${routeName}`, router);
  } else if (router) {
    console.log(`跳过非Express路由模块: ${routeName}`);
  }
});


// 初始化 WebSocket 管理器
const initWebSocketManager = require('./scoket/wsManager');
const wsManager = initWebSocketManager(server);

// 自动加载 WebSocket 端点
const socketDir = path.join(__dirname, 'scoket');
fs.readdirSync(socketDir).forEach(file => {
  // 跳过 wsManager.js 文件
  if (file === 'wsManager.js') return;
  
  const filePath = path.join(socketDir, file);
  const stats = fs.statSync(filePath);
  
  // 只处理 JS 文件
  if (stats.isFile() && file.endsWith('.js')) {
    const socketName = file.replace('.js', '');
    const socketModule = require(filePath);
    
    // 注册 WebSocket 端点
    if (socketModule) {
      // 如果模块导出了 handleRequest 函数，使用它
      // 否则假设整个模块就是处理函数
      const handler = socketModule.handleRequest || socketModule;
      
      if (typeof handler === 'function') {
        const socketPath = `/${socketName}`;
        wsManager.registerEndpoint(socketPath, handler);
        console.log(`注册 WebSocket 端点: ${socketPath}`);
      }
    }
  }
});

// 启动服务器
server.listen(PORT, () => {
  console.log("服务器启动成功，端口为:" + PORT);
  console.log("WebSocket 服务已启动，共享同一端口");
});
